package com.office.common.utils.file;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 文档解析工具类
 * 用于解析Word和Excel文档内容
 * 
 * @author 数字牧马人
 */
public class DocumentParserUtils {
    
    private static final Logger log = LoggerFactory.getLogger(DocumentParserUtils.class);
    
    /**
     * 解析Word文档内容
     * @param inputStream 文档输入流
     * @param fileName 文件名
     * @return 文档内容
     */
    public static String parseWordDocument(InputStream inputStream, String fileName) {
        try {
            String fileExtension = getFileExtension(fileName).toLowerCase();
            
            if ("docx".equals(fileExtension)) {
                return parseDocxFile(inputStream);
            } else if ("doc".equals(fileExtension)) {
                // 对于.doc文件，返回提示信息，建议转换为.docx格式
                log.warn("暂不支持.doc格式，建议转换为.docx格式: {}", fileName);
                return "此文档为旧版Word格式(.doc)，暂不支持解析。建议将文档另存为.docx格式后重新上传。";
            } else {
                log.warn("不支持的Word文档格式: {}", fileExtension);
                return "";
            }
        } catch (Exception e) {
            log.error("解析Word文档失败: {}, 错误: {}", fileName, e.getMessage());
            return "";
        }
    }
    
    /**
     * 解析Excel文档内容
     * @param inputStream 文档输入流
     * @param fileName 文件名
     * @return 文档内容
     */
    public static String parseExcelDocument(InputStream inputStream, String fileName) {
        try {
            Workbook workbook = WorkbookFactory.create(inputStream);
            StringBuilder content = new StringBuilder();
            
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                Sheet sheet = workbook.getSheetAt(i);
                content.append("工作表: ").append(sheet.getSheetName()).append("\n");
                
                for (Row row : sheet) {
                    for (Cell cell : row) {
                        String cellValue = getCellValueAsString(cell);
                        if (!cellValue.isEmpty()) {
                            content.append(cellValue).append("\t");
                        }
                    }
                    content.append("\n");
                }
                content.append("\n");
            }
            
            workbook.close();
            return content.toString().trim();
            
        } catch (Exception e) {
            log.error("解析Excel文档失败: {}, 错误: {}", fileName, e.getMessage());
            return "";
        }
    }
    
    /**
     * 解析.docx文件
     * @param inputStream 输入流
     * @return 文档内容
     */
    private static String parseDocxFile(InputStream inputStream) throws Exception {
        XWPFDocument document = new XWPFDocument(inputStream);
        StringBuilder content = new StringBuilder();
        
        // 提取段落文本
        for (XWPFParagraph paragraph : document.getParagraphs()) {
            String text = paragraph.getText().trim();
            if (!text.isEmpty()) {
                content.append(text).append("\n");
            }
        }
        
        // 提取表格文本
        for (XWPFTable table : document.getTables()) {
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    String text = cell.getText().trim();
                    if (!text.isEmpty()) {
                        content.append(text).append("\t");
                    }
                }
                content.append("\n");
            }
        }
        
        document.close();
        return content.toString().trim();
    }
    

    
    /**
     * 获取单元格值作为字符串
     * @param cell 单元格
     * @return 字符串值
     */
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    return String.valueOf(cell.getNumericCellValue());
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            default:
                return "";
        }
    }
    
    /**
     * 获取文件扩展名
     * @param fileName 文件名
     * @return 扩展名
     */
    private static String getFileExtension(String fileName) {
        int lastDotIndex = fileName.lastIndexOf(".");
        if (lastDotIndex > 0 && lastDotIndex < fileName.length() - 1) {
            return fileName.substring(lastDotIndex + 1);
        }
        return "";
    }
    
    /**
     * 检查是否为Word文档
     * @param fileName 文件名
     * @return 是否为Word文档
     */
    public static boolean isWordDocument(String fileName) {
        String extension = getFileExtension(fileName).toLowerCase();
        return "doc".equals(extension) || "docx".equals(extension);
    }
    
    /**
     * 检查是否为支持的Word文档格式
     * @param fileName 文件名
     * @return 是否为支持的格式
     */
    public static boolean isSupportedWordDocument(String fileName) {
        String extension = getFileExtension(fileName).toLowerCase();
        return "docx".equals(extension); // 目前只支持.docx格式
    }
    
    /**
     * 检查是否为Excel文档
     * @param fileName 文件名
     * @return 是否为Excel文档
     */
    public static boolean isExcelDocument(String fileName) {
        String extension = getFileExtension(fileName).toLowerCase();
        return "xls".equals(extension) || "xlsx".equals(extension);
    }
} 